package repository

import (
	"errors"
	"fmt"
	"go-web-mini/common"
	"go-web-mini/model"
	"go-web-mini/vo"
	"strings"
)

type ITodoTestRepository interface {
	Add(todo *model.Todo) error                                // 创建用户
	GetById(id uint) (model.Todo, error)                       // 获取单个用户
	GetList(req *vo.TodoRequest) ([]*model.Todo, int64, error) // 获取用户列表
	Update(todo *model.Todo) error                             // 更新用户
	BatchDeleteByIds(ids []uint) error                         // 批量删除

}

type TodoRepository struct {
}

func NewTodoRepository() TodoRepository {
	return TodoRepository{}
}

// 创建用户
func (ur TodoRepository) Add(todo *model.Todo) error {
	err := common.DB.Create(todo).Error
	return err
}

// 获取单个用户
func (ur TodoRepository) GetById(id uint) (model.Todo, error) {
	fmt.Println("GettodoById---")
	var todo model.Todo
	err := common.DB.Where("id = ?", id).First(&todo).Error
	return todo, err
}

// 获取用户列表
func (ur TodoRepository) GetList(req *vo.TodoRequest) ([]*model.Todo, int64, error) {
	var list []*model.Todo
	db := common.DB.Model(&model.Todo{}).Order("id DESC")

	todoname := strings.TrimSpace(req.Title)
	if todoname != "" {
		db = db.Where("title LIKE ?", fmt.Sprintf("%%%s%%", todoname))
	}

	// 当pageNum > 0 且 pageSize > 0 才分页
	//记录总条数
	var total int64
	err := db.Count(&total).Error
	if err != nil {
		return list, total, err
	}
	pageNum := int(req.PageNum)
	pageSize := int(req.PageSize)
	if pageNum > 0 && pageSize > 0 {
		err = db.Offset((pageNum - 1) * pageSize).Limit(pageSize).Find(&list).Error
	} else {
		err = db.Find(&list).Error
	}
	return list, total, err
}

// 更新用户
func (ur TodoRepository) Update(todo *model.Todo) error {
	err := common.DB.Model(todo).Updates(todo).Error
	if err != nil {
		return err
	}
	return err
}

// 批量删除
func (ur TodoRepository) BatchDeleteByIds(ids []uint) error {
	// 用户和角色存在多对多关联关系
	var todos []model.Todo
	for _, id := range ids {
		// 根据ID获取用户
		todo, err := ur.GetById(id)
		if err != nil {
			return errors.New(fmt.Sprintf("未获取到ID为%d的用户", id))
		}
		todos = append(todos, todo)
	}

	err := common.DB.Delete(&todos).Error

	return err
}
